package com.bawei.lib_common.diffutil

import androidx.recyclerview.widget.DiffUtil


/**
 * 一.四级缓存-》回收复用ViewHolder-》目的减少viewHolder创建和绑定数据次数（onCreateViewHolder onBindViewHolder）
 *
 * 1.屏幕内缓存： 屏幕内缓存指在屏幕中显示的ViewHolder，在快速滑动时屏幕内viewholder的复用
 * 2.屏幕外缓存： 当列表滑动出了屏幕时，缓存的ViewHolder默认是2个：mCacheViews（复用的时候不需要onCreate和onBind）
 * 3.RecycledViewPool类是用来缓存ViewHolder，一种item类型存储5个viewHolder（复用的时候不需要onCreate，需要onBind）
 * 多个页面的recyclerview可以共享viewholder，可以通过setRecycledViewPool(RecycledViewPool)设置同一个RecycledViewPool，他们就可以共享ViewHolder
 * 4.开发者可自定义缓存，是虚拟类ViewCacheExtension的一个实例，开发者可实现方法getViewForPositionAndType(Recycler recycler, int position, int type)来实现自己的缓存
 *
 * 二.局部刷新，局部增量刷新
 * （1）局部刷新（刷新整个item）：notifyItemInserted、notifyItemRemoved、notifyItemChanged、notifyItemMoved
 * （2）局部增量刷新payloads(只刷新一个item某个控件)：adapter.notifyItemRangeChanged(position,“payload”) + onBindViewHolder(holder: MyViewHolder, position: Int, payloads: MutableList<Any>)
 * （3）使用DiffUtils完成局部刷新和局部增量刷新
 *      a。自定义DiffUtils.CallBack：重写对比id、对比内容、payload局部增量刷新
 *      b.适配器使用CallBack进行计算
 *         val calculateDiff = DiffUtil.calculateDiff(MyDiffCallBack(data.toList(), newData))//旧数据和新数据,注意不要传引用，使用toList
 *         data.clear()
 *         data.addAll(newData)
 *         calculateDiff.dispatchUpdatesTo(this)
 *      c。设置新的数据源
 *          a。对比id：判断是否有新增id和删除id
 *          b。id相同，对比内容
 *              内容相同不刷新
 *              内容不同--》局部增量刷新payloads
 *  总结：
 * （1）和（2）适用于item，点赞、收藏、删除一个条目、新增一个条目
 * （3）适用于刷新整个列表，比如首页数据刷新，对比差距实现局部刷新*
 *
 * 三.布局优化
 * 1.减少item层级嵌套
 * 2.item高度固定
 *
 * 四.onCreateViewHolder和onBindViewHolder不要做复杂操作，不要创建对象
 * （1）不要在onBindViewHolder实现点击事件，放在viewHolder构造中实现
 *
 *  六.图片加载：滑动暂停加载图片、停止滑动再去加载
 *
 *
 */

class DiffCallBack(private val oldList: List<MyModel>, private val newList: List<MyModel>) :
    DiffUtil.Callback() {
    override fun getOldListSize(): Int {
        return oldList.size
    }

    override fun getNewListSize(): Int {
        return newList.size
    }

    /**
     * 比较是否是同一个item条目
     */
    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return oldList[oldItemPosition].did == newList[newItemPosition].did
    }

    /**
     * 比较同一个item条目的内容是否相同
     */
    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return oldList[oldItemPosition] == newList[newItemPosition]
    }
}